/**
 * type和interface的区别
 * type 侧重于对类型直接取别名
 * interface 主要是定义对象的数据类型
 *
 * 区别1: type 可以为基本类型，联合类型 或 元组 甚至any等等 赋值定义别名,interface 明显办不到
 * 区别2: interface 定义重名了会合并属性，type 办不到(会报错提醒 重复定义)
 *
 */
type Demo = string | number
let age1: Demo = 18;
let age2: Demo = "20";
console.log(age1, age2);

// type 定义对象
type Myobj = {
    [pName: string]: string
}
let student: Myobj = {
    name: "zhangsan"
};
console.log(student.name);

// type 扩展
type myobj = { name: string }
type myobjPlus = myobj & { age: number }

let obj: myobjPlus = {
    name: "xiaohong",
    age: 19
};
console.log(obj); //{ name: 'xiaohong', age: 19 }


// interface
interface newobj {
    name: string;
    age: number;
}

let mynewobj: newobj = {
    name: "ikun",
    age: 20
};
console.log(mynewobj); //{ name: 'ikun', age: 20 }

// interface 扩展
interface newobjPlus extends newobj {
    uname: string,
    rap: boolean
}

let plusobj: newobjPlus = {
    name: "lisa",
    age: 18,
    uname: "AI_lisa",
    rap: true
};
console.log(plusobj); //{ name: 'lisa', age: 18, uname: 'AI_lisa', rap: true }


/**
 * type 的一般使用场景
 * 一般定义基本或联合类型
 * 一般定义元组类型
 * 一般定义函数类型
 * 定义映射类型
 * interface 的使用场景
 * 需要interface 重名会自动合并属性扩展的
 * 定义对象数据结构(不使用type时)
 */
type A = string
type B = [string | number]
type C = string | number
type D = C | [1, 2, 3, 4]

// interface 可以属性合并
interface E {
    name: string;
}

interface E {
    age: number;
}

let _e: E = {
    name: "zhang",
    age: 22
};
console.log(_e); //{ name: 'zhang', age: 22 }


